package gestionBDD;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class requetesStats {
	
	public String meilleurClient ;
	public String meilleurTirage ;
	public float montantTotalMoyen ;
	public float montantTotalMaxUneCommande ;
	public float montantCumuleMax ;
	public float chiffreAffaire ;
	public Integer nombreCommande ;
	public String tiragePopulaire ;
	
	public requetesStats() throws SQLException {
		
		trouverNombreCommande() ;
		trouverMontantTotalMax() ;
		trouverMontantCummuleMax();
		trouverMeilleurClient();
		trouverMontantTotalMoyen();
		trouverChiffreAffaire();
		trouverTiragePopulaire();
	}

	/**
	 * Trouve le nombre de commandes total
	 * @throws SQLException 
	 */
	public void trouverNombreCommande() throws SQLException {
		String sql = "SELECT COUNT(reference) FROM COMMANDE";
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();
        this.nombreCommande = rs.getInt("COUNT(reference)") ;		
	}
	
	/**
	 * Trouve le montant total maximum d'une commande
	 * @throws SQLException 
	 */
	public void trouverMontantTotalMax() throws SQLException {
		String sql = "SELECT MAX(montant_total) FROM COMMANDE" ;
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();
        this.montantTotalMaxUneCommande =  rs.getFloat("MAX(montant_total)") ;
	}
	
	/**
	 * Trouve la plus grosse somme commandée (en plusieurs fois) parmi tous les clients
	 * @throws SQLException 
	 */
	public void trouverMontantCummuleMax() throws SQLException {
		String sql = "SELECT MAX(SommeMontant) FROM " +
				"(SELECT SUM(montant_total) as SommeMontant FROM CLIENT, COMMANDE " +
				"WHERE COMMANDE.id_client = CLIENT.id_client " +
				"GROUP BY CLIENT.id_client) MontantTable" ;
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();
        this.montantCumuleMax =  rs.getFloat("MAX(SommeMontant)") ;
	}
	
	/**
	 * Trouve le meilleur client (celui qui a le plus commandé en valeur)
	 * @throws SQLException 
	 */
	public void trouverMeilleurClient() throws SQLException {
		String sql = "SELECT SUM(montant_total) as SommeMontant , NOM, PRENOM, CLIENT.id_client " +
				"FROM CLIENT, COMMANDE " +
				"WHERE COMMANDE.id_client = CLIENT.id_client " +
				"GROUP BY CLIENT.id_client " + 
				"HAVING SommeMontant = ? ";

		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
		statement.setObject(1, this.montantCumuleMax);
        ResultSet rs = statement.executeQuery();
        rs.next();
        meilleurClient = rs.getString("NOM") + " " + rs.getString("PRENOM");
	}
	
	/**
	 * Trouve le prix moyen des commandes
	 * @throws SQLException 
	 */
	public void trouverMontantTotalMoyen() throws SQLException {
		String sql = "SELECT AVG(montant_total) FROM COMMANDE";
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();		
        montantTotalMoyen = rs.getFloat("AVG(montant_total)") ;

	}
	/**
	 * Trouve le chiffre d'affaire
	 * @throws SQLException 
	 */
	public void trouverChiffreAffaire() throws SQLException {
		String sql = "SELECT SUM(montant_total) FROM COMMANDE";
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();		
        chiffreAffaire = rs.getFloat("SUM(montant_total)") ;		
	}
	
	/**
	 * Trouve le meilleur tirage (celui le plus utilisé)
	 * @throws SQLException 
	 */
	public void trouverTiragePopulaire() throws SQLException {
		String sql = "SELECT MAX(QteTirage), libelle FROM " +
				"(SELECT COUNT(LIGNE_COMMANDE.id_format) as QteTirage, libelle " +
				"FROM LIGNE_COMMANDE, TIRAGE " +
				"WHERE LIGNE_COMMANDE.id_format = TIRAGE.id_format " +
				"GROUP BY TIRAGE.id_format) TableParTirage" ;
		PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
        ResultSet rs = statement.executeQuery();
        rs.next();		
        tiragePopulaire = rs.getString("libelle") ;			
	}
	
}
